package com.qf.result;

import com.alibaba.fastjson.JSONObject;

import java.util.Map;

/**
 *封装rest api 返回结果
 * 这个类是通用的
 * 这个类需要支持链式编程
 * 这个类应该避免魔法值的使用
 * 魔法值：即未经预先定义的常量
 * @author: 姜红凯
 * @date: 2022.04.01
 */
public class R {
    private int code;
    private String msg;
    private Object result;
    public static final int OK_200 = 200;
    public static final String OK_MSG = "请求成功";
    public static final int E_500 = 500;
    public static final String E_MSG = "请求失败";
    private static final int IS_OK = 100;

    /**
     * 无字段式响应结果
     * 只要满足编程规范，即便不存在ok字段
     * 最后转化为json也有一个boolean类型来判断请求的ok字段是否为true
     * 好处是，前段拿到json可以直接 if(r.code==200||r.code==201……)
     * @return
     */
    public boolean isOk() {
        if (this.code / IS_OK == 2) {
            return true;
        }
        return false;
    }

    public R setCode(int code) {
        this.code = code;
        return this;
    }

    public R setMsg(String msg) {
        this.msg = msg;
        return this;
    }

    public R setResult(Object result) {
        this.result = result;
        return this;
    }

    public R setResult(String key, Object value) {
        if (result == null) {
            JSONObject result = new JSONObject();
            result.put(key, value);
            this.result = result;
        } else {
            //instanceof 比较类型
            if (result instanceof JSONObject) {
                ((JSONObject) result).put(key, value);
            }
            if (result instanceof Map) {
                ((Map) result).put(key, value);
            }
        }
       return this;
    }


    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    public Object getResult() {
        return result;
    }
    /**
     * 封装调用成功的方法
     */
    public static R ok(){
        R r=new R().setCode(OK_200).setMsg(OK_MSG);
        return r;
    }
    public static R ok(int code){
        R r=ok().setCode(code);
        return r;
    }
    public static R ok(String msg){
        R r=ok().setMsg(msg);
        return r;
    }
    public static R ok(Object data){
        return ok().setResult(data);
    }
    public static R ok(int code,String msg){
        R r=ok().setCode(code).setMsg(msg);
        return r;
    }

    /**
     *调用失败的方法
     */
    public static R error(){
        R r=new R().setCode(E_500).setMsg(E_MSG);
        return r;
    }
    public static R error(int code){
        return R.error().setCode(code);
    }
    public static R error(String msg){
        return R.error().setMsg(msg);
    }
    public static R error(Object data){
        return error().setResult(data);
    }
    public static R error(int code,String msg){
        return R.error().setCode(code).setMsg(msg);
    }


    public String toJsonString(R r){
        return JSONObject.toJSONString(r);
    }

    /**
     *
     * @return
     */
    @Override
    public String toString() {
        //把自己传里面
        return toJsonString(this);
    }
}
